package tool;/*
@Date:2024/12/3
*/

import java.util.Scanner;

/**
 * ⼯具类的作⽤:
 * 处理各种情况的⽤户输⼊，并且能够按照程序员的需求，得到⽤户的控制台输⼊。
 */
public class Utility {
    //静态属性
    private static Scanner scanner = new Scanner(System.in);

    /**
     * 功能：读取键盘输⼊的⼀个菜单选项，值：1——6的范围
     *
     * @return 1——6
     */
    public static char readMenuSelection() {
        char c;
        for (; ; ) {
            String str = readKeyBoard(1, false);//包含⼀个字符的字符串
            c = str.charAt(0);
            if (c != '1' && c != '2' && c != '3' & c != '4' & c != '5'& c != '6') {
                System.out.println("选择错误，请重新输⼊：");
            } else break;
        }
        return c;
    }

    /**
     * 功能：读取键盘输⼊的⼀个字符
     *
     * @return ⼀个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);//读取字符
        return str.charAt(0);
    }

    /**
     * 功能：读取键盘输⼊的⼀个字符，如果直接按回⻋，则返回指定的默认值；否则返回输⼊的那个字符
     *
     * @param defaultValue 指定的默认值
     * @return 默认值或输⼊的字符
     */
    public static char readChar(char defaultValue) {
        String str = readKeyBoard(1, true);//读取结果不是字符就是⼀个空的字符串


        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    /**
     * 功能：读取键盘输⼊的整型，⻓度⼩于2位
     *
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, true);//读取⼀个整数，⻓度<=10位
            try {
                n = Integer.parseInt(str);//进⾏转型，字符转换成整数
                break;
            } catch (NumberFormatException e) {
                System.out.println("数字输⼊的有错误，请重新输⼊！");
            }
        }
        return n;
    }

    /**
     * 功能：读取键盘输⼊的 整数或默认值，如果直接回⻋，则返回默认值，否则返回输⼊的整数
     *
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;
        for (; ; ) {
            String str = readKeyBoard(10, true);
            if (str.equals("")) {
                return defaultValue;
            }
            //异常处理
            try {
                n = Integer.parseInt(str);
                break;
            } catch (NumberFormatException e) {
                System.out.println("数字输⼊的有错误，请重新输⼊！");
            }
        }
        return n;
    }

    /**
     * 功能：读取键盘输⼊的指定⻓度的字符串
     *
     * @param limit 限制的⻓度
     * @return 指定⻓度的字符串
     */
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 功能：读取键盘输⼊的指定⻓度的字符串或默认值，如果直接回⻋，返回默认值，否则返回字符串
     * 加中实训加中实训加中实训
     * 加中实训加中实训加中实训
     * 加中实训
     *
     * @param limit        限制的⻓度
     * @param defaultValue 指定的默认值
     * @return 指定⻓度的字符串
     */
    public static String readString(int limit, String defaultValue) {
        String str = readKeyBoard(limit, true);
        return str.equals("") ? defaultValue : str;
    }
    /**
     * 功能：读取键盘输⼊的确认选项，Y或N
     * 将⼩的功能，封装到⼀个⽅法中.
     *
     * @return Y或N
     */
    public static char readConfirmSelection() {
        System.out.println("请输⼊你的选择（Y/N）");
        char c;
        for (; ; ) {
            //将接受的字符转换成⼤写字⺟
            String str = readKeyBoard(1, false).toUpperCase();
            c = str.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.println("选择有错误，请重新输⼊！");
            }
        }
        return c;
    }
    /**
     * 功能： 读取⼀个字符串
     *
     * @param limit       读取的⻓度
     * @param blankReturn 如果为true ,表示 可以读空字符串。
     *                    如果为false表示 不能读空字符串。
     *                    <p>
     *                    如果输⼊为空，或者输⼊⼤于limit的⻓度，就会提示重新输⼊。
     * @return
     */
    public static String readKeyBoard(int limit, boolean blankReturn) {
        //定义⼀个字符串
        String line = "";
        while (scanner.hasNextLine()) {//判断是否有下⼀⾏
            line = scanner.nextLine();
            //如果line.length=0, 即⽤户没有输⼊任何内容，直接回⻋
            if (line.length() == 0) {
                if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                else continue; //如果blankReturn=false,不接受空串，必须输⼊内容
            }
            //如果⽤户输⼊的内容⼤于了 limit，就提示重写输⼊
            //如果⽤户如的内容 >0 <= limit ,我就接受
            if (line.length() < 1 || line.length() > limit) {
                System.out.print("输⼊⻓度（不能⼤于" + limit + "）错误，请重新输⼊：");
                continue;
            }
            break;
        }
        return line;
    }
}